from passlib.context import CryptContext
import re

# 创建密码上下文
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")


def get_hashed_password(password: str = "123456") -> str:
    """
    对密码进行哈希处理。

    参数:
        password (str): 明文密码。

    返回:
        str: 哈希后的密码。
    """
    return pwd_context.hash(password)


def verify_password(password: str, hashed_pass: str) -> bool:
    """
    验证密码是否匹配哈希值。

    参数:
        password (str): 明文密码。
        hashed_pass (str): 哈希后的密码。

    返回:
        bool: 如果密码匹配则返回 True，否则返回 False。
    """
    return pwd_context.verify(password, hashed_pass)


"""校验密码符合是否符合标准

Keyword arguments:
password -- 明文密码
Return: 
True -- 校验成功
False -- 校验失败
errors -- 错误提示
"""


def validate_password(password):
    errors = []
    if len(password) < 8:
        errors.append("密码长度至少为8个字符")
    if not re.search(r"[0-9]", password):
        errors.append("密码必须包含至少一个数字（0-9）")
    if not re.search(r"[a-z]", password):
        errors.append("密码必须包含至少一个小写字母（a-z）")
    if not re.search(r"[A-Z]", password):
        errors.append("密码必须包含至少一个大写字母（A-Z）")
    if not re.search(r"[!@#$%^&*]", password):
        errors.append("密码必须包含至少一个特殊字符（例如 !@#$%^&*）")

    if not errors:
        return True, "密码符合规范。"
    else:
        return False, "\n ".join(f"{index}: {error}" for index, error in enumerate(errors, start=1))


"""校验手机号格式是否正确

Keyword arguments:
phone -- 手机号
Return: 
True -- 校验成功
False -- 校验失败
"""


def is_valid_phone_number(phone):
    pattern = re.compile(r'^1[3-9]\d{9}$')
    if pattern.match(phone):
        return True
    else:
        return False
    

"""校验身份证格式是否正确

Keyword arguments:
id_card -- 身份证号
Return: 
True -- 校验成功
False -- 校验失败
"""
def validate_id_card(id_card):
    # 正则表达式匹配身份证号
    pattern = re.compile(r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}(\d|X|x)$')
    if pattern.match(id_card):
        return True
    else:
        return False


if __name__ == '__main__':
    # 调试hash密码：$2b$12$kaL6c0vcgTuGz8dqGyWf8eUpeampA.7ng4aMX4itHarEIXsJkCsVa
    print(get_hashed_password('123456'))
